package Transports;

import java.util.ArrayList;
import java.util.Iterator;

import Serveur.Serveur;

//nouveau commit
public abstract class Transports {

	//Connaitre l'identifiant d'un transport
	int idTransport;

	//Connaitre la capacité d'un transport
	int capacite;

	//Connaitre le prix du billet pour un transport
	double prixBilletDepart;

	//Connaitre le type du tansport
	TypeTransport typeDuTransport;

	//Prix forfaitaire du billet
	protected static final double PRIX_FORFAITAIRE = 30;


	/**
	 * Obtenir le prix au kilometre de toutes les classes filles
	 * @return
	 */
	public abstract double getPrixAuKilometre();

	/**
	 * Constructeur normal
	 * Le tranport est directement ajouté dans le seveur
	 * 
	 * @param nom
	 * @param description
	 * @param capacite
	 */
	public Transports(Serveur serv, double prixBilletdep, int capacite) {
		idTransport = serv.getIdentifiantValideTransport();
		this.capacite = capacite;
		this.prixBilletDepart = prixBilletdep;
		
		serv.addTransport(this);
	}
	/**
	 * Constructeur avec identifiant
	 * Le tranport n'est pas ajouter au serveur dans la liste
	 * @param serv
	 * @param idTransport
	 * @param prixBilletdep
	 * @param capacite
	 */
	public Transports(Serveur serv,int idTransport, double prixBilletdep, int capacite) {
		this.idTransport = idTransport;
		this.capacite = capacite;
		this.prixBilletDepart = prixBilletdep;
	}
	@Override
	public String toString() {
		return this.typeDuTransport.toString() + " / Capacite: " + capacite + "/ Prix:" + this.prixBilletDepart;
	}

	public void print() {
		System.out.println(toString());
	}

	@Override
	public boolean equals(Object arg0) {
		
		Transports trans = (Transports) arg0;
		
		if (!(trans.getCapacite() == capacite)) {
			return false;
		}
		
		if(!(idTransport == trans.getIdTransport())){
			return false;
		}

		if(typeDuTransport == null) return true;
		
		if(this.typeDuTransport.compareTo(trans.typeDuTransport) != 0){
			return false;
		}
		
		return true;

	}

	public int getIdTransport() {
		return idTransport;
	}

	public double getPrixBillet() {
		return prixBilletDepart;
	}

	public TypeTransport getTypeDuTransport() {
		return typeDuTransport;
	}

	public void setCapacite(int capacite) {
		this.capacite = capacite;
	}

	public int getCapacite() {
		return capacite;
	}

	/**
	 * Rechercher un Transport dans le serveur
	 * 
	 * @param ListeTransport
	 * @param nom
	 * @return
	 */
	public static ArrayList<Transports> searchTransport(
			ArrayList<Transports> ListeTransport, TypeTransport type) {
		ArrayList<Transports> ListeRetour = new ArrayList<Transports>();

		Iterator<Transports> it = ListeTransport.iterator();
		while (it.hasNext()) {
			Transports current = it.next();
			if (current.getTypeDuTransport().equals(type)) {
				ListeRetour.add(current);
			}
		}
		return ListeRetour;
	}

	/**
	 * Rechercher un transport dans le serveur
	 * 
	 * @param ListeTransport
	 * @param T
	 * @return
	 */
	public static ArrayList<Transports> searchTransport(
			ArrayList<Transports> ListeTransport, Transports T) {
		ArrayList<Transports> ListeRetour = new ArrayList<Transports>();

		Iterator<Transports> it = ListeTransport.iterator();
		while (it.hasNext()) {
			Transports current = it.next();
			if (current.equals(T)) {
				ListeRetour.add(current);
			}
		}

		return ListeRetour;
	}

	/**
	 * Recherche un transport par son numero
	 * 
	 */
	public static Transports getTransport(ArrayList<Transports> ListeTranport,
			int num) {
		Iterator<Transports> it = ListeTranport.iterator();
		while (it.hasNext()) {
			Transports t = it.next();
			if (t.getIdTransport() == num) {
				return t;
			}
		}
		return null;
	}

	public void setIdTransport(int idTransport) {
		this.idTransport = idTransport;
	}
}
